package tiers1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import tiers2.NotBoundException_Exception;
import tiers2.Tweet;
import tiers2.Utilisateur;
import tiers2.ServiceMetierService;
import tiers2.ServiceMetier;

public class Client {

	static ServiceMetierService stub;
	static ServiceMetier serviceRef;
	
	public static void main(String[] args) throws Exception {
		
		boolean ok = true;
		stub = new ServiceMetierService();
		serviceRef = stub.getServiceMetierPort();
		
		
		while(ok){
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			afficherMenuAccueil();
			try {
				int choix = Integer.valueOf(br.readLine());
				Utilisateur utilisateur;
				// L'utilisateur à le choix soit de se connecter soit de créer un nouveau compte
				switch (choix) {
					case 1: utilisateur = connexion(br);
							actionUtilisateur(br, utilisateur);
							break;
					case 2: utilisateur = inscription(br);
							actionUtilisateur(br, utilisateur);
							break;
					default : System.out.println("Choix non valide \n");
							  break;
				}
			} catch (Exception e) {
				System.out.println("\n" + "Choix non valide");
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * Affichage de la page de login
	 */
	private static void afficherMenuAccueil(){
		System.out.println("Pour vous connecter : tapez 1");
		System.out.println("Pour vous inscrire : tapez 2");
	}
	
	/**
	 * Affichage de la page d'accueil
	 */
	private static void afficherMenuUtilisateur(){
		System.out.println("\n" + "Pour poster un tweet : tapez 1");
		System.out.println("Pour consulter votre profil : tapez 2");
		System.out.println("Pour consulter le profil d'un autre utilisateur : tapez 3");
		System.out.println("Pour consulter la liste de tweets de vos abonnés : tapez 4");
		System.out.println("Pour supprimer un de vos tweets : tapez 5");
		System.out.println("Pour quitter l'application : tapez 6");
	}
	
	/**
	 * Affichage du menu contextuel de séléction profil
	 */
	private static void sousMenuAffichageProfil(BufferedReader br, Utilisateur identifier) throws Exception {
		System.out.println("Pour effectuer une recherche par nom : tapez 1");
		System.out.println("Pour afficher la liste des utilisateurs : tapez 2");
		try {
			int choix = Integer.valueOf(br.readLine());
			switch (choix){
				case 1 : System.out.println("Veuillez saisir le nom de l'utilisateur");
						String nom = br.readLine();
						List<Utilisateur> listeUtilisateurs = serviceRef.listerUtilisateurRechercheNom(nom.toLowerCase());
						serviceRef.listerUtilisateurRechercheNom(nom.toLowerCase());
						if(listeUtilisateurs.size() == 0){
							System.out.println("Aucun n'utilisateur n'existe pour ce nom.");
						} else if(listeUtilisateurs.size() == 1){
							System.out.println(serviceRef.afficherProfil(listeUtilisateurs.get(0).getId()));
							if(identifier.getListeUtilisateurs().contains(listeUtilisateurs.get(0).getId())){
								System.out.println("\n Se désabonner de cet utilisateur? (toute autre réponse que 'y' signifiera non)?");
								String abonnement = br.readLine();
								if(abonnement.equals("y")){
									serviceRef.desabonner(identifier, listeUtilisateurs.get(0).getId());
									System.out.println("Vous ne suivez plus "+listeUtilisateurs.get(0).getNom()+" "+listeUtilisateurs.get(0).getPrenom());
								}
							}else{
								System.out.println("\n Voulez-vous vous abonner à cet utilisateur (toute autre réponse que 'y' signifiera non)?");
								String abonnement = br.readLine();
								if(abonnement.equals("y")){
									serviceRef.abonner(identifier, listeUtilisateurs.get(0).getId());
									System.out.println("Vous suivez maintenant "+listeUtilisateurs.get(0).getNom()+" "+listeUtilisateurs.get(0).getPrenom());
								}
							}
						} else {
							System.out.println("Il existe plusieurs utilisateurs pour ce nom : \n");
							for (Utilisateur utilisateur : listeUtilisateurs) {
								System.out.println("Login : " + utilisateur.getLogin());
							}
							System.out.println("\n" + "Veuillez choisir un login parmis la liste ci-dessus");
							String loginChoisi = br.readLine();
							Utilisateur utilisateur = serviceRef.rechercheUtilisateurParLogin(loginChoisi);
							System.out.println("\n" + serviceRef.afficherProfil(utilisateur.getId()));
							if(identifier.getListeUtilisateurs().contains(utilisateur.getId())){
								System.out.println("\n Se désabonner de cet utilisateur? (toute autre réponse que 'y' signifiera non)?");
								String ab = br.readLine();
								if(ab.equals("y")){
									serviceRef.desabonner(identifier, utilisateur.getId());
									System.out.println("Vous ne suivez plus "+utilisateur.getNom()+" "+utilisateur.getPrenom());
								}
							}else{
								System.out.println("\n Voulez-vous vous abonner à cet utilisateur (toute autre réponse que 'y' signifiera non)?");
								String ab = br.readLine();
								if(ab.equals("y")){
									serviceRef.abonner(identifier, utilisateur.getId());
									System.out.println("Vous suivez maintenant "+utilisateur.getNom()+" "+utilisateur.getPrenom());
								}
							}
						}
						break;
				case 2 : System.out.println("Liste des utilisateurs : \n");
						for (Utilisateur utilisateur : serviceRef.listerUtilisateurs()) {
							System.out.println(utilisateur.getNom());
						} 
						break;
				default : System.out.println("Choix non valide \n");
				  		  break;
			}
		} catch (NumberFormatException | IOException e) {
			System.out.println("\n Choix non valide");
		}
	}
	
	/**
	 * Traite les choix de l'utilisateur en rapport avec le menu de la page d'accueil
	 */
	private static void actionUtilisateur(BufferedReader br, Utilisateur utilisateur) throws Exception {
		try {
			boolean connecter = true;
			while(connecter == true){
				afficherMenuUtilisateur();
				int choix = Integer.valueOf(br.readLine());
				switch (choix) {
				case 1: System.out.println("\n" + "Merci de saisir le tweet que vous souhaitez poster.");
						String tweet = br.readLine();
						serviceRef.envoyerTweet(utilisateur.getId(), tweet);
						break;
				case 2: System.out.println(serviceRef.afficherProfil(utilisateur.getId()));
						break;
				case 3 : sousMenuAffichageProfil(br, utilisateur);
						 break;
				case 4 : afficherTweetsAbonnement(utilisateur);
						 break;
				case 5:	menuSupprimerTweet(br, utilisateur);
						break;
				case 6 : System.out.println("Merci, à bientôt"); 
						 System.exit(1);
				default : System.out.println("Choix non valide \n");
						  break;
				}
			}
		} catch (NumberFormatException | IOException e) {
			System.out.println("\n" + "Choix non valide");
		}
	}
	
	/**
	 * Menu de création de compte utilisateur en lien avec la méthode afficherMenuAccueil()
	 */
	private static Utilisateur inscription(BufferedReader br) throws Exception {
		boolean choixLogin = false;
		String login = "";
		System.out.println("\n" + "Veuillez saisir votre nom"); 
		String nom = br.readLine().toLowerCase();
		System.out.println("\n" + "Veuillez saisir votre prénom");
		String prenom = br.readLine().toLowerCase();
		System.out.println("\n" + "Veuillez saisir votre adresse email");
		String mail = br.readLine();
		System.out.println("\n" + "Veuillez saisir votre login");
		while(choixLogin == false){
			login = br.readLine().toLowerCase();
			if(serviceRef.rechercheUtilisateurParLogin(login) != null){
				System.out.println("\n" + "Ce login existe déjà, merci d'en choisir un autre");
				
			} else {
				choixLogin = true;
			}
		}
		System.out.println("\n" + "Veuillez saisir votre mot de passe");
		String mdp = br.readLine();
 		Utilisateur utilisateur = serviceRef.creerCompte(nom, prenom, mail, login, mdp);
		if(utilisateur != null){
			System.out.println("\n" + "Inscription Réussie");
		} else {
			System.out.println("Un problème à eu lieu lors de l'inscription");
		}
		return utilisateur;
	}
	
	/**
	 * Menu de connexion utilisateur en lien avec la méthode afficherMenuAccueil()
	 */
	private static Utilisateur connexion(BufferedReader br) throws Exception {
		boolean connexion = false;
		String mdpSaisi = "";
		String loginSaisi ="";
		Utilisateur utilisateur = null;
		while(!connexion) {
    		System.out.println("\n" + "Merci de saisir votre login");
			loginSaisi = br.readLine().toLowerCase();
    		System.out.println("\n" + "Merci de saisir votre mot de passe");
			mdpSaisi = br.readLine();
			utilisateur = serviceRef.authentifier(loginSaisi, mdpSaisi);
			if(utilisateur == null){
				System.out.println("Erreur d'authentification.");
			} else {
				System.out.println("\nBienvenue dans Twitter!");
				return utilisateur;
			}
    	}
		return null;
    }
	
	/**
	 * Affiche l'ensemble des tweets posté par les utilisateur auquel notre utlisateur est abonné
	 */
	private static void afficherTweetsAbonnement(Utilisateur utilisateur) throws NotBoundException_Exception{
		List<Tweet> tweetAfficher = serviceRef.listerTweetsDesUtilisateursSuivis(utilisateur);
		System.out.println("########## Mon flux de tweets ##########");
		for(Tweet tweet : tweetAfficher){
			System.out.println("\n---"+tweet.getDate()+"---\n");
			System.out.println("  " + tweet.getContenu() + "\n");
			
		}
	}
	
	/**
	 * Affichage du menu de suppression de tweets
	 */
	private static void menuSupprimerTweet(BufferedReader br, Utilisateur utilisateur) throws NotBoundException_Exception, NumberFormatException, IOException{
		List<Tweet> tweetAfficher = serviceRef.listeTweetUtilisateur(utilisateur);
		int i = 0;
		System.out.println("########## Mon flux de tweets ##########");
		for(Tweet tweet : tweetAfficher){
			System.out.println("\n"+i+")---"+tweet.getDate()+"---\n");
			System.out.println("  " + tweet.getContenu() + "\n");
			i++;
		}
		System.out.print("Taper le numéro du tweet à supprimer:");
		int numTweet = Integer.parseInt(br.readLine());
		if(tweetAfficher.get(numTweet) != null){
			serviceRef.suppressionTweet(utilisateur, tweetAfficher.get(numTweet));
			System.out.println("Votre tweet a été supprimé...");
		}else{
			System.out.println("Choix non valide \n");
		}
	}
}
